add mnnvl pipeline using gb200 nodes - #873
Conversation
… into rjsouza/gb200-ci
|
Azure Pipelines: There may be pipelines that require an authorized user to comment /azp run to run. |
There was a problem hiding this comment.
Pull request overview
Adds a GB200 MNNVL Azure pipeline for deployment, unit testing, and collective benchmarking.
Changes:
- Adds GB200 deployment and test templates.
- Adds GB200 benchmark tuning support.
- Introduces proxy SSH, IMEX, and multi-architecture image handling.
Reviewed changes
Copilot reviewed 9 out of 10 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
test/deploy/setup.sh |
Formatting-only updates. |
test/deploy/run-remote.sh |
Adds proxy SSH and optional library-path setup. |
test/deploy/deploy.sh |
Adds pilot, proxy, IMEX, and AppArmor handling. |
python/mscclpp_benchmark/tuning_config.py |
Recognizes GB200 GPUs. |
python/mscclpp_benchmark/bench_collective.py |
Enables NVLS candidates for GB200. |
docker/build.sh |
Revises multi-architecture manifest instructions. |
.azure-pipelines/templates/ut-gb200.yml |
Adds GB200 unit-test workflows. |
.azure-pipelines/templates/deploy.yml |
Adds pilot deployment support. |
.azure-pipelines/multi-nodes-test.yml |
Formatting-only update. |
.azure-pipelines/mnnvl-test.yml |
Adds the MNNVL pipeline. |
Suppressed comments (2)
test/deploy/deploy.sh:107
- This now adds the GB200 IMEX device to every CUDA deployment, including the existing H100/A100 jobs that share this script. Docker rejects
--devicewhen the host path does not exist, so those pipelines will fail at container creation. Gate this option to the GB200 deployment (and ensure that flag is passed correctly) while retaining plain--gpus=allelsewhere.
LAUNCH_OPTION="--gpus=all --device /dev/nvidia-caps-imex-channels/channel0"
test/deploy/deploy.sh:120
- The AppArmor workaround described above is GB200/kernel-specific, but this applies
apparmor=unconfinedto every default CUDA and ROCm test container. That unnecessarily removes AppArmor isolation from unrelated CI jobs. Scope the option to the affected GB200 deployment instead of changing the security profile globally.
SECURITY_OPTION="--security-opt apparmor=unconfined"
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| targetType: filePath | ||
| filePath: test/deploy/deploy.sh | ||
| arguments: ${{ parameters.deployArgs }} ${{ parameters.containerName }} ${{ parameters.sglangImage }} | ||
| arguments: ${{ parameters.deployArgs }} ${{ parameters.containerName }} ${{ parameters.sglangImage }} ${{ parameters.pilot }} |
| SSH_EXTRA_ARGS="-i ${KeyFilePath}" | ||
| if [ -n "${SSH_PROXY_JUMP:-}" ]; then | ||
| PROXY_KEY_OPT="" | ||
| [ -n "${SSH_PROXY_KEY:-}" ] && PROXY_KEY_OPT="-i ${SSH_PROXY_KEY} " | ||
| SSH_EXTRA_ARGS="${SSH_EXTRA_ARGS} -o ProxyCommand=\"ssh ${PROXY_KEY_OPT}-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p ${SSH_PROXY_JUMP}\"" |
| - name: hostfile | ||
| type: string | ||
| default: '$(System.DefaultWorkingDirectory)/test/deploy/hostfile' | ||
| # Container-side hostfile passed to mpirun (one ip per line). |
There was a problem hiding this comment.
Revert this change?
There was a problem hiding this comment.
Revert this one?
| if $USE_DOCKER; then | ||
| INNER="set -euxo pipefail;" | ||
| INNER+=" cd /root/mscclpp;" | ||
| INNER+=" [ -f /root/mscclpp/.ldpath ] && source /root/mscclpp/.ldpath;" |
There was a problem hiding this comment.
Why need this?
| - task: Bash@3 | ||
| displayName: Generate deploy files | ||
| inputs: | ||
| targetType: 'inline' | ||
| script: | | ||
| set -e | ||
| DEPLOY_DIR="$(System.DefaultWorkingDirectory)/test/deploy" | ||
| # First NVLink pair (2 nodes) from hostEntries; use $1 (the IP) so the | ||
| # names resolve inside the container too (the DSM hostnames are only in | ||
| # the agent's /etc/hosts). Bump to more nodes by parsing further lines. | ||
| NODE0=$(awk 'NF>=2{print $1; exit}' <<< "${{ parameters.hostEntries }}") | ||
| NODE1=$(awk 'NF>=2{c++} c==2{print $1; exit}' <<< "${{ parameters.hostEntries }}") | ||
|
|
||
| echo "Host ${NODE0} | ||
| Port 22345 | ||
| IdentityFile /root/mscclpp/sshkey | ||
| StrictHostKeyChecking no | ||
| Host ${NODE1} | ||
| Port 22345 | ||
| IdentityFile /root/mscclpp/sshkey | ||
| StrictHostKeyChecking no" > "${DEPLOY_DIR}/config" | ||
|
|
||
| printf '%s\n%s\n' "azhpcuser@${NODE0}" "azhpcuser@${NODE1}" > "${DEPLOY_DIR}/hostfile" | ||
|
|
||
| printf '%s\n%s\n' "${NODE0}" "${NODE1}" > "${DEPLOY_DIR}/hostfile_mpi" | ||
|
|
||
| # Publish the head node so the run steps can target it without hardcoding. | ||
| echo "##vso[task.setvariable variable=headNode]${NODE0}" |
There was a problem hiding this comment.
We use only 2 nodes here? But provide 4 nodes?
| displayName: Run Collective Benchmarks | ||
| runRemoteArgs: '--hostfile $(System.DefaultWorkingDirectory)/test/deploy/hostfile --host $(headNode) --user azhpcuser' | ||
| remoteScript: | | ||
| mpirun --allow-run-as-root --bind-to numa -hostfile /root/mscclpp/test/deploy/hostfile_mpi -mca btl_tcp_if_include 10.0.5.0/24 -np 8 -npernode 4 \ |
There was a problem hiding this comment.
Can we not hard code 10.0.5.0/24?
| # and MultiProcessTest.* (Prelim / HostName / HostHash). | ||
| - name: crossNodeFilter | ||
| type: string | ||
| default: '-Communicator,Executor,Ib,MemoryChannel,PortChannel,SemaphorePerf,SwitchChannel,TimeoutWithId' |
There was a problem hiding this comment.
Why exclude MemoryChannel,PortChannel,SemaphorePerf,SwitchChannel?
Add pipeline that runs on gb200 nodes, this allows for testing of mnnvl functionality and performance.